package qujian;

import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;

/**
 * 给定一个会议时间安排的数组，每个会议时间都会包括开始和结束的时间 [[s1,e1],[s2,e2],…] (si < ei)，
 * 为避免会议冲突，同时要考虑充分利用会议室资源，请你计算至少需要多少间会议室，才能满足这些会议安排。
 * <p>
 * 示例 1:
 * 输入: [[0, 30],[5, 10],[15, 20]]
 * 输出: 2
 * <p>
 * 示例 2:
 * 输入: [[7,10],[2,4]]
 * 输出: 1
 *
 * @author luolidong
 * @version 1.0
 * @create 2021-08-03 15:26
 */
public class L253 {
    public int minMeetingRooms(int[][] intervals) {
        //排序
        Arrays.sort(intervals, (x, y) -> x[0] - y[0]);
        //使用小顶堆
        Queue<Integer> queue = new PriorityQueue<>();
        queue.offer(intervals[0][1]);

        for (int i = 1; i < intervals.length; i++) {
            if (intervals[i][0] >= queue.peek()) {//如果前一个已经用完了，弹出
                queue.poll();
            }
            queue.offer(intervals[i][1]);
        }
        return queue.size();
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int i = scanner.nextInt();
        int[][] intervals = new int[i][2];
        for (int j = 0; j < i; j++) {
            intervals[j][0] = scanner.nextInt();
            intervals[j][1] = scanner.nextInt();
        }

        L253 l253 = new L253();
        int i1 = l253.minMeetingRooms(intervals);
        System.out.println(i1);
    }
}
